package cn.com.blueInfo.bpm.system.service.impl;

import cn.com.blueInfo.bpm.system.convert.RoleConvert;
import cn.com.blueInfo.bpm.system.entity.Role;
import cn.com.blueInfo.bpm.system.repository.RoleRepository;
import cn.com.blueInfo.bpm.system.request.RoleDTO;
import cn.com.blueInfo.bpm.system.response.RoleVO;
import cn.com.blueInfo.bpm.system.service.RoleService;
import cn.com.blueInfo.core.util.SnowflakeIdGenerator;
import cn.com.blueInfo.utils.result.ResultInfo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 角色表 业务服务实现类
 * @author suxch
 * @since 2025-09-01 19:17:41
 */
@Log4j2
@Service
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleRepository roleRepository;

    @Autowired
    private SnowflakeIdGenerator snowflakeIdGenerator;

    @Autowired
    private RoleConvert roleConvert;

    /**
     * 新增角色
     * @param roleDTO 角色参数
     */
    @Override
    public ResultInfo<Integer> addRole(RoleDTO roleDTO) {
        Role role = roleConvert.dtoToEntity(roleDTO);
        role.setId(snowflakeIdGenerator.nextId());
        Integer addSize = roleRepository.createRole(role);
        return ResultInfo.<Integer>builder().data(addSize).message("角色成功新增 {} 条").build();
    }

    /**
     * 批量新增角色
     * @param roleDTOList 角色参数列表
     */
    @Override
    public ResultInfo<Integer> batchAddRole(List<RoleDTO> roleDTOList) {
        List<Role> roleList = roleConvert.dtoToEntity(roleDTOList);
        for (Role role : roleList) role.setId(snowflakeIdGenerator.nextId());
        Integer addSize = roleRepository.batchCreateRole(roleList);
        return ResultInfo.<Integer>builder().data(addSize).message("角色成功新增 {} 条").build();
    }

    /**
     * 删除角色
     * @param roleId 角色ID
     */
    @Override
    public ResultInfo<Integer> removeRole(Long roleId) {
        Integer removeSize = roleRepository.deleteRole(roleId);
        return ResultInfo.<Integer>builder().data(removeSize).message("角色成功删除 {} 条").build();
    }

    /**
     * 批量删除角色
     * @param roleIdList 角色ID列表
     */
    @Override
    public ResultInfo<Integer> batchRemoveRole(List<Long> roleIdList) {
        Integer removeSize = roleRepository.batchDeleteRole(roleIdList);
        return ResultInfo.<Integer>builder().data(removeSize).message("角色成功删除 {} 条").build();
    }

    /**
     * 更新部分角色
     * @param roleUpdatePartialDTO 角色参数
     */
    @Override
    public ResultInfo<Integer> modifyRolePartial(RoleDTO.UpdatePartialDTO roleUpdatePartialDTO) {
        Role role = roleConvert.dtoToEntity(roleUpdatePartialDTO);
        Integer modifySize = roleRepository.updateRolePartial(role);
        return ResultInfo.<Integer>builder().data(modifySize).message("角色成功更新 {} 条").build();
    }

    /**
     * 更新全部角色
     * @param roleDTO 角色参数
     */
    @Override
    public ResultInfo<Integer> modifyRole(RoleDTO roleDTO) {
        Role role = roleConvert.dtoToEntity(roleDTO);
        Integer modifySize = roleRepository.updateRole(role);
        return ResultInfo.<Integer>builder().data(modifySize).message("角色成功更新 {} 条").build();
    }

    /**
     * 查询一条角色
     * @param roleId 角色ID
     */
    @Override
    public ResultInfo<RoleVO> queryRoleById(Long roleId) {
        Role role = roleRepository.getRoleById(roleId);
        RoleVO roleVO = roleConvert.entityToVO(role);
        return ResultInfo.<RoleVO>builder().data(roleVO).message("角色查询成功").build();
    }

    /**
     * 分页查询角色
     * @param roleQueryDTO 角色参数
     */
    @Override
    public ResultInfo<Page<RoleVO>> queryRolePage(RoleDTO.QueryDTO roleQueryDTO) {
        Page<Role> rolePage = roleRepository.getRolePage(roleQueryDTO);
        Page<RoleVO> resultData = roleConvert.convertPage(rolePage);
        return ResultInfo.<Page<RoleVO>>builder()
                .data(resultData)
                .message("角色分页查询成功，共 {} 条", resultData.getRecords().size())
                .build();
    }

    /**
     * 根据条件查询 角色 数量
     * @param roleQueryDTO 角色参数
     */
    @Override
    public ResultInfo<Long> queryRoleCount(RoleDTO.QueryDTO roleQueryDTO) {
        Long resultCount = roleRepository.getRoleCount(roleQueryDTO);
        return ResultInfo.<Long>builder()
                .data(resultCount)
                .message("角色数量查询成功，共 {} 条", resultCount)
                .build();
    }

    /**
     * 根据条件查询 角色
     * @param roleQueryDTO 角色参数
     */
    @Override
    public ResultInfo<List<RoleVO>> queryRoleList(RoleDTO.QueryDTO roleQueryDTO) {
        List<Role> roleList = roleRepository.getRoleList(roleQueryDTO);
        List<RoleVO> resultData = roleConvert.entityListToVoList(roleList);
        return ResultInfo.<List<RoleVO>>builder()
                .data(resultData)
                .message("角色分页查询成功，共 {} 条", resultData.size())
                .build();
    }
}
